from enum import Enum
from typing import List

from emi.bar.data import RankMeta, SymbolMeta
from emi.bar.db import MarketMeta, BarDB, DayDB, RankDB

class MarketIndex(Enum):
    """
    市场大盘指数结构数据
    """
    CH_SH = SymbolMeta(name="上证指数",code="000001")
    CH_SZ = SymbolMeta(name="深证指数",code="399001")
    CH_CY = SymbolMeta(name="创业板",code="399006")


class Market:
    """

    """

    def on_market_open(self):
        """
        当市场开盘时，需要做一些初始化和状态重置工作。比如：获取的DayDB.getDay()要切换到今天。
        :return:
        """
        pass

    def on_market_close(self):
        """
        当市场关闭时，需要做一些资源释放操作。
        :return:
        """
        pass

    def getId(self)->int:
        """
        market的ID值。
        """
        raise NotImplementedError()

    def get_meta(self)->MarketMeta:
        raise NotImplementedError()

    def get_index_bar_db(self)->BarDB:
        """
        返回大盘指数历史行情数据。 具体大盘可以查看：MarketIndex里面的枚举值
        :return:
        """
        raise NotImplementedError()

    def get_index_today_db(self)->DayDB:
        """
        返回大盘指数实时行情数据。 具体大盘可以查看：MarketIndex里面的枚举值
        :return:
        """
        raise NotImplementedError()

    def get_bar_db(self, category_type: int = None) -> BarDB:
        """
        返回历史行情数据:（适合按个股遍历）
        :category_type 行业分类类型的实时数据
            为None时，表示所有的市场个股行情
            否则表示获取行业分类类型下面的所有行业数据。具体可以看：MarketMeta.get_category_type_name_map()有定义。
        """
        raise NotImplementedError()

    def get_today_db(self,category_type:int = None)->DayDB:
        """
        返回今天的实时行情数据。
        行业元组数据:
        :category_type 行业分类类型的实时数据
            为None时，表示所有的市场个股行情
            否则表示获取行业分类类型下面的所有行业数据。具体可以看：MarketMeta.get_category_type_name_map()有定义。
        """
        raise NotImplementedError()

    def getRankMetas(self)->List[RankMeta]:
        """
        返回排名元数据对象。
        :return:
        """
        raise NotImplementedError()

    def getRankDB(self,rank_meta:RankMeta)->RankDB:
        """
        返回市场的排名数据
        :param rank_meta: 排名元数据对象。
        :return:
        """
        raise NotImplementedError()

    def get_markdown_desc(self):
        """
        返回markdown格式的描述。
        :return:
        """
        return ""


